package com.zyy.weather.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zyy.weather.dto.ReplyDTO;
import com.zyy.weather.dto.XmlDTO;
import com.zyy.weather.entity.Reply;
import com.zyy.weather.entity.TextMessage;
import com.zyy.weather.mapper.ReplyMapper;
import com.zyy.weather.service.WeixinService;
import com.zyy.weather.util.MessageUtil;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
import java.net.URLEncoder;
import java.util.List;

@Service
public class WeixinServiceImpl implements WeixinService {

    @Autowired
    private ReplyMapper replyMapper;

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 处理接收到的数据取出消息内容
     *
     * @param sMsg
     * @return
     * @throws Exception
     */
    @Override
    public XmlDTO getMessage(String sMsg) throws Exception {
        //调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
        DocumentBuilder db = dbf.newDocumentBuilder();
        //将输入消息转化为字符流的方式
        StringReader sr = new StringReader(sMsg);
        //把要解析的 XML 文档转化为输入流，以便 DOM 解析器解析它
        InputSource is = new InputSource(sr);
        //调用 DOM 解析器对象的 parse() 方法解析 XML 文档，得到代表整个文档的 Document 对象，进行可以利用DOM特性对整个XML文档进行操作了
        Document document = db.parse(is);
        Element root = document.getDocumentElement();
        //转换成XmlDTO格式
        XmlDTO xmlDTO = getXmlDTO(root);


        return xmlDTO;
    }

    /**
     * 将Element转换为XmlDTO
     *
     * @param root
     * @return
     */
    private XmlDTO getXmlDTO(Element root) {
        XmlDTO xmlDTO = new XmlDTO();
        xmlDTO.setToUserName(root.getElementsByTagName("ToUserName").item(0).getTextContent());
        xmlDTO.setFromUserName(root.getElementsByTagName("FromUserName").item(0).getTextContent());
        xmlDTO.setCreateTime(root.getElementsByTagName("CreateTime").item(0).getTextContent());
        xmlDTO.setMsgType(root.getElementsByTagName("MsgType").item(0).getTextContent());
        xmlDTO.setContent(root.getElementsByTagName("Content").item(0).getTextContent());
        xmlDTO.setMsgId(root.getElementsByTagName("MsgId").item(0).getTextContent());
        xmlDTO.setAgentID(root.getElementsByTagName("AgentID").item(0).getTextContent());
        return xmlDTO;
    }

    /**
     * 查询数据库获取回复语句
     *
     * 统一返回msg消息有最后进行输出
     *
     * @param xmlDTO
     * @return
     */
    @Override
    public String getReply(XmlDTO xmlDTO) {
        //取出接收到的消息并且urlencode处理
        String msg = "秃头太笨了现在还不会这些";
        try {
            if (xmlDTO.getContent().equals("我是谁")) {
                msg = "你是" + xmlDTO.getFromUserName() + "吗？";
                return msg;
            } else {
                QueryWrapper<Reply> wrapper = new QueryWrapper<>();
                wrapper.like("message", xmlDTO.getContent());
                List<Reply> replies = replyMapper.selectList(wrapper);
                //当查询不到需要的语句时查找网络接口
                if (replies.size() == 0) {
                    String encode = URLEncoder.encode(xmlDTO.getContent(), "utf-8");
                    String url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg=" + encode;
                    ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class);
                    ReplyDTO replyDTO = JSONObject.parseObject(entity.getBody(), ReplyDTO.class);
                    return replyDTO.getContent();
                }
                return replies.get(0).getReply();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return msg;

    }

    /**
     * 发送消息方法
     *
     * @param reply
     * @return
     */
    @Override
    public String sendMessage(String reply) {
        TextMessage textMessage = new TextMessage();
        textMessage.setToUserName("ww77f62d9043238de5");
        textMessage.setContent(reply);
        textMessage.setCreateTime(DateTime.now().toString("yyyy-MM-dd HH:mm:ss"));
        textMessage.setMsgType("text");
        String sRespData = MessageUtil.textMessageToXml(textMessage);
        return sRespData;

    }
}
